import { Message } from '@arco-design/web-vue'
import { get } from 'lodash-es'
/**
 * 该文件可自行根据业务逻辑进行调整
 */
import {
  authenticateResponseInterceptor,
  defaultResponseInterceptor,
  errorMessageResponseInterceptor,
  RequestClient,
} from './request-client'
import { getHttpErrorMessage } from './request-client/utils'

/**
 * @description:  headers contentType
 */
export enum ContentTypeEnum {
  // json
  JSON = 'application/json;charset=UTF-8',
  // form-data qs
  FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
  // form-data  upload
  FORM_DATA = 'multipart/form-data;charset=UTF-8',
}

const baseURL = import.meta.env.VITE_HTTP_API

function createRequestClient() {
  const client = new RequestClient({
    baseURL,
  })

  function formatToken(token?: string) {
    return token ? `Bearer ${token}` : null
  }

  // 请求头处理
  client.addRequestInterceptor({
    fulfilled: async (config) => {
      config.headers.Authorization = formatToken(CookieHelper.get())
      config.headers['Content-Type'] = ContentTypeEnum.JSON
      config.headers['Content-Type'] = 'application/json'

      return config
    },
  })

  // token过期的处理
  client.addResponseInterceptor(
    authenticateResponseInterceptor({
      client,
      enableRefreshToken: false,
      formatToken,
    }),
  )

  // 处理返回的响应数据格式
  client.addResponseInterceptor(
    defaultResponseInterceptor({
      codeField: 'code',
      dataField: 'data',
      successCode: 12156200,
    }),
  )

  // 通用的错误处理,如果没有进入上面的错误处理逻辑，就会进入这里
  client.addResponseInterceptor(
    errorMessageResponseInterceptor((msg: string, error) => {
      // 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理，根据不同的 code 做不同的提示，而不是直接使用 message.error 提示 msg
      // 当前mock接口返回的错误字段是 error 或者 message
      if (get(error, ['config', 'ignoreToast'], false)) {
        return
      }
      Message.clear()
      const responseData = error?.response?.data ?? error?.data ?? {}
      const errorMessage = responseData?.error ?? responseData?.message ?? ''
      if (!errorMessage) {
        // 如果没有错误信息，则会根据状态码进行提示
        const message = getHttpErrorMessage(responseData?.code)
        Message.error(message || errorMessage || msg)
        return
      }
      Message.error(errorMessage)
    }),
  )

  return client
}

export const requestClient = createRequestClient()
export const defHttp = requestClient
export const baseRequestClient = new RequestClient({ baseURL })
